import { initGlobalAPI } from './globalAPI'
import { initMixin } from './init'
import { initLifeCycle } from './lifecycle'
import Watcher, { nextTick } from './observe/watcher'

function Vue(options) {
    this._init(options)
}

Vue.prototype.$nextTick = nextTick
initMixin(Vue)//扩展了init方法
initLifeCycle(Vue)
initGlobalAPI(Vue)

Vue.prototype.$watch=function (exprOrFn,cb,options={}) {
    // console.log(exprOrFn,cb,options)
    // firstname
    // ()=> vm.firstname

    // firstname的值变化了直接执行cb函数即可
    new Watcher(this,exprOrFn,{user:true},cb)
}






export default Vue

// vue核心流程
// 1. 创造了响应式数据
// 2. 模板转化为ast语法树
// 3. 将ast语法树转化为render函数
// 4. 后续每次数据更新可以只执行render函数，(无需再次执行ast转化的过程)

// render函数会去产生虚拟节点（使用响应式数据）
// 根据产生的虚拟节点创造真实的dom
